#define _CRT_SECURE_NO_WARNINGS 1

#include<stdlib.h>  //包含atoi函数的头文件
#include<ctype.h>   //包含is_digit函数和isspace函数的头文件
#include<stdio.h>
#include<assert.h>

//模拟实现atoi函数
//atoi函数：将字符串数字转换成整数
//得解决的问题
//  1、 空指针的问题
//  2、 空字符串的问题
//  3、空白字符         ————isspace判断是不是空白字符
//  4、符号问题
//  5、数字超过范围
//  6、非数字字符串问题   ————isdigit判断是不是数字字符串
enum
{
	VALID,    //正常返回
	INVALID   //非法返回
}state = INVALID;  //全局的状态，它的值标志着返回的是合法的值还是异常非法返回1
int my_atoi(const char* str)
{
	int flag = 1;//符号标志
	assert(str);//断言防止传入空指针 ————解决空指针问题
	//解决空字符串问题
	if (*str == '\0')
	{
		return 0;
	}
	//解决空白字符的问题 ————跳过空白字符
	while (isspace(*str))//判断是不是空白字符
	{
		str++;
	}
	//处理正负号问题
	if (*str == '-')
	{
		flag = -1;
		str++;
	}
	else if (*str == '+')
	{
		str++;
	}
	long long ret = 0;
	while (*str != '\0')
	{
		if (isdigit(*str))//判断是不是数字字符
		{
			ret = ret * 10 + flag * (*str - '0');
			if (ret < INT_MIN || ret > INT_MAX)  //判断是不是越界超出范围
			{
				return 0;
			}
		}
		else  //遇到非数字字符
		{
			return (int)ret;
		}
		str++;
	}
	state = VALID;  //这里返回才是正常返回，在上面提前返回都是异常返回
	return (int)ret;
}
int main()
{
	char arr[] = "    -123";
	int ret = my_atoi(arr);
	if (state == VALID)
	{
		printf("%d\n", ret);
	}
	else
	{
		printf("异常非法返回: %d\n", ret);
	}
	return 0;
}